/******************************************************************************
** 公司名称：天津柯迪斯科技有限公司
** 版权信息：
** 文件名称： bsp_USART.c
** 模块名称： KD986_New仪表串口初始化模块
** 版 本 号： V1.0
** 作    者： 蒲磊
**
** 修改记录： 版本     修改人      时间         修改内容
**
******************************************************************************/

/******************************************************************************
* 头文件
******************************************************************************/
#include <string.h>
#include <stdio.h>
#include "bsp_USART.h"
#include "App_Protocol.h"

/******************************************************************************
* 本文件宏定义 ('#define')
******************************************************************************/
#define USART1_TX_BUFFER_SIZE		10
#define USART1_RX_BUFFER_SIZE		50
#define USART_BT_TX_BUFFER_SIZE		    50
#define USART_BT_RX_BUFFER_SIZE		    200
/******************************************************************************
* 本文件类型定义 ('typedef')
******************************************************************************/

/******************************************************************************
* 本文件静态函数声明 ('static')
******************************************************************************/

/******************************************************************************
* 全局变量定义
******************************************************************************/
uint8_t USART1_Tx_Buffer[USART1_TX_BUFFER_SIZE] = {0};		/*USART1发送缓冲区*/
uint8_t USART1_Rx_Buffer[USART1_RX_BUFFER_SIZE] = {0};		/*USART1接收缓冲区*/
uint8_t	USART_BT_Rx_Buffer[USART_BT_RX_BUFFER_SIZE]   = {0};		/*和蓝牙模块通信串口接收缓冲区*/
/*****************************************************************************
* 函数实现 - global ('extern') and local ('static')
******************************************************************************/


/******************************************************************************
** 功  能：串口1初始化
** 参  数：Bandrate-波特率
** 返回值：无
** 备  注：用于仪表和控制器通信。PA9=USART1_TX,PA10=USART1_RX
**         通信采用Idle中断+DMA的方式进行接收不定长数据
******************************************************************************/
void vBsp_USART1_Init(void)
{
    MX_USART1_UART_Init();          /*初始化串口1，用于和控制器通信*/

    HAL_UARTEx_ReceiveToIdle_DMA(&huart1,USART1_Rx_Buffer,USART1_RX_BUFFER_SIZE);

}

/******************************************************************************
** 功  能：串口3初始化
** 参  数：Bandrate-波特率
** 返回值：无
** 备  注：用于仪表和蓝牙模块通信
**         通信采用Idle中断+DMA的方式进行接收不定长数据
******************************************************************************/
void vBsp_USART_BT_Init(void)
{
    MX_USART2_UART_Init();          /*初始化串口2，用于和蓝牙通信*/
    HAL_UARTEx_ReceiveToIdle_DMA(&huart2,USART_BT_Rx_Buffer,USART_BT_RX_BUFFER_SIZE);
}

/******************************************************************************
** 功  能：串口接收事件回调函数
** 参  数：无
** 返回值：无
** 备  注：用于检测一帧接收完毕
******************************************************************************/
void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size)
{
    uint8_t n;

    if(huart->Instance == USART1)
    {
        if(huart1.RxEventType == HAL_UART_RXEVENT_IDLE)     /*确认是空闲中断事件*/
        {
            HAL_UART_DMAStop(&huart1);           /*禁用DMA传输*/
            /*此处拷贝接收到的数据，给协议处理层*/
            vPROTOCOL_Get_OneFrame(USART1_Rx_Buffer,Size);

            HAL_UARTEx_ReceiveToIdle_DMA(&huart1,USART1_Rx_Buffer,USART1_RX_BUFFER_SIZE);       /*重新开启DMA传输*/
        }
    }
    else if(huart->Instance == USART2)
    {
        if(huart2.RxEventType == HAL_UART_RXEVENT_IDLE)     /*确认是空闲中断事件*/
        {
            HAL_UART_DMAStop(&huart1);           /*禁用DMA传输*/
            /*此处拷贝接收到的数据，给协议处理层*/
//            for(n = 0;n < Size;n++)
//            {
//                uart_receive_input(USART_BT_Rx_Buffer[n]);                /*将Uart1接收到的数据传给蓝牙*/                                     /*注意必须每个字节调用一次，否则出错*/
//                bt_uart_service();
//            }
            HAL_UARTEx_ReceiveToIdle_DMA(&huart1,USART1_Rx_Buffer,USART1_RX_BUFFER_SIZE);       /*重新开启DMA传输*/
        }
    }
}






/******************************************************************************
** 功  能：串口1发送函数
** 参  数：pData-要发送到数据指针，Len-要发送到数据长度
** 返回值：无
** 备  注：采用DMA发送，函数立即返回
******************************************************************************/
void USART_MCU_Send_Frame(uint8_t *pData,uint16_t Len)
{
    memcpy(USART1_Tx_Buffer,pData,Len);				/*拷贝数据到发送缓冲区*/

    HAL_UART_Transmit_DMA(&huart1,USART1_Tx_Buffer,Len);   /*启动DMA发送*/
}

/******************************************************************************
** 功  能：蓝牙串口发送函数
** 参  数：pData-要发送到数据指针，Len-要发送到数据长度
** 返回值：无
** 备  注：采用DMA发送，函数立即返回
******************************************************************************/
void USART_BT_Send_Frame(uint8_t *pData,uint16_t Len)
{
#if USE_BLUETOOTH == 1
    HAL_UART_Transmit(huart2,pData,Len,1000);
#endif
}


